package com.ceair.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ceair.entity.SysDictData;
import com.ceair.entity.request.dictionary.DictDataInOrUpReq;
import com.ceair.entity.request.dictionary.QueryDictDataReq;
import com.ceair.entity.vo.dictionary.SysDictDataVO;
import com.ceair.mapper.SysDictDataMapper;
import com.ceair.service.ISysDictDataService;
import com.ceair.utils.SysDictDataStructMapper;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 字典数据表 服务实现类
 * </p>
 *
 * @author wangbaohai
 * @since 2025-03-27
 */
@Service
public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService {

    /**
     * 分页查询字典数据。
     *
     * @param queryDictDataReq 查询字典数据的请求对象，包含分页信息和查询条件。
     *                         - queryDictDataReq.getPageReq().getCurrent(): 当前页码。
     *                         - queryDictDataReq.getPageReq().getSize(): 每页显示的数据条数。
     * @return 返回一个分页对象 Page<SysDictData>，包含查询结果和分页信息。
     */
    @Override
    public Page<SysDictData> queryDictDataWithPage(QueryDictDataReq queryDictDataReq) {
        // 初始化分页工具以及参数，设置当前页码和每页大小
        Page<SysDictData> page = new Page<>(queryDictDataReq.getPageReq().getCurrent(),
                queryDictDataReq.getPageReq().getSize());

        // 调用mapper进行分页查询，返回查询结果
        return this.baseMapper.queryDictDataWithPage(page, queryDictDataReq);
    }

    /**
     * 保存或更新字典数据。
     *
     * @param dictDataInOrUpReq 包含字典数据的请求对象，用于传递需要保存或更新的数据。
     *                          请求对象中的非空字段会被复制到目标对象中，空值字段将被忽略。
     * @return 返回保存或更新后的字典数据视图对象（VO），供调用方使用。
     */
    @Override
    public SysDictDataVO save(DictDataInOrUpReq dictDataInOrUpReq) {
        // 初始化字典数据实体对象
        SysDictData sysDictData = new SysDictData();

        // 将请求对象中的非空字段复制到字典数据实体对象中，避免空值覆盖已有数据
        BeanUtil.copyProperties(dictDataInOrUpReq, sysDictData, CopyOptions.create().ignoreNullValue());

        // 调用 saveOrUpdate 方法，根据主键判断是执行更新还是插入操作
        saveOrUpdate(sysDictData);

        // 将保存或更新后的字典数据实体对象转换为视图对象（VO）并返回
        return SysDictDataStructMapper.INSTANCE.toVO(sysDictData);
    }



}
